mp_data <- read.csv("../data/merged_data/01_manyprimates_pilot_merged_data_v2.csv")
Descriptives
Here is an overview of our sample. The size and diversity are impressive.
Sample size
mp_data %>%
summarize(N = n_distinct(subject_site),
Species = n_distinct(species),
Sites = n_distinct(site) - 1) %>% # sweetwaters and sweetwaters_group2
kable()
Sample size by species
mp_data %>%
group_by(species) %>%
summarize(N = n_distinct(subject_site),
Sites = n_distinct(site)) %>%
kable()
| barbary_macaque |
3 |
1 |
| black_and_white_ruffed_lemur |
7 |
1 |
| black_faced_spider_monkey |
1 |
1 |
| bonobo |
11 |
2 |
| brown_capuchin_monkey |
46 |
2 |
| chimpanzee |
51 |
5 |
| gorilla |
5 |
2 |
| long_tailed_macaque |
28 |
1 |
| orangutan |
5 |
1 |
| rhesus_macaque |
3 |
1 |
| ring_tailed_lemur |
9 |
2 |
| squirrel_monkey |
18 |
1 |
Visual overview
First an overview of the data, plotted by species and delay. Small, transparent dots represent aggregated data for each individual by delay. Solid dots are species means for a given delay. Error bars are 95% confidence intervals (CI). Dotted line represents level expected by chance. Performance is significantly different from chance, if the CI does not overlap with the chance line.
Species are grouped by phylogeny, with lemurs on top, followed by new world monkeys, old world monkeys and apes.
Inference: GLMM
The main purpose of the model is to test our two hypothesis:
- Probability of correct choice decreases with delay length (main effect of delay)
- Probability of correct choice decreases in older individuals in longer delays (interaction between age and delay)
The pre-registered model had the following structure
correct ~ delay * age +
task_experience + cup_distance + board_size + trial +
(1 + delay + trial | site/subject/block/hiding_location ) +
(1 + task_experience + cup_distance + board_size + trial + delay | species)
Based on convergence issues and other considerations (see 05_mixed_model file for details on the decision process) we modified the random effect structure and remove board size, which co-varied with cup distance. The reduced model has the following structure:
correct ~ delay * norm_age +
task_experience + cup_distance + trial +
(1 + delay | site/subject_site) +
(1 + delay | species)
Variable names in the data frame:
subject_site = subject
norm_age = age divided by species longevity and scaled and centered across species
Below, we plot odds ratios for fixed effects. As a guideline for interpretation, errorbars that do not overlap with the vertical line indicate a significant effect in the model.
Effect of delay
What we see is a significant effect of delay. The reference level is the short delay condition and performance in the long as well as in the medium condition are significantly worse compared to this. This suggests that, across species, performance decreases in the delay trials. This confirms the intuition one gets from looking at the summary plot above. In another model, not shown here, we tested if medium delay is also different from long delay and found that this was the case. This shows a graded retention effect across species.
Interaction of age and delay
No such interaction could be found in the model. Below we plot performance aggregated for each subject against age (regression line is smoothed conditional mean with 95% CI). This visualization confirms the statistical analysis. As part of the exploratory analysis, we might want to look for a quadratic or cubic relation between age, delay and performance.
Effect of cup distance
We did not expect such an effect and looking at the data it is unlikely that cup distance in and of itself is driving this effect. Looking at the graph below, one can see that cup distance is confounded with species (presumably due to body size) and also site within species. This is effect is therefore likely a result of adjusting the test setup to site and species.
Comparing sites
Here we select the species for which we have data from multiple sites. This is a rough way of checking whether there is a lot of variation between sites. Plotting conventions are the same as above.
Based on the table above, we have data from multiple sites for bonobos, chimpanzees, capuchins, gorillas and ring-tailed lemurs. The most informative plots will be the ones for chimpanzees and capuchins because there we have the largest sample size per site.
We can compare absolute level of performance (in what range of correct proportions does the data across delays from each site fall) as well as relative (how do the delays compare to one another).
Chimpanzees
Here we see that performance on an absolute level is fairly similar across sites. The Leipzig chimpanzees seem to perform better compared to the others, but this might be due to them being involved in a lot of studies using the same or a very similar setup.
Ring-tailed lemurs
Again, the absolute level is similar across sites, but there are very few data from one site.
Brown Capuchins
Here we have a decent sample size for both sites. Absolute and relative performance looks very similar.
Bonobos
Here we have relatively few data and therefore quite variable estimates. Performance looks more variable compared to the other species.
Gorillas
Relative performance looks similar. The Lincoln Park gorillas did consistently worse than the Heidelberg gorillas, but there’s little data for either site.
Comparing across task-experience
Even though we did not find an overall effect of task experience in the model, it might be interesting to look at how subjects from one species with different levels of task experience perform. This only applies to chimpanzees and bonobos. However, task experience is confounded with site. In the plots below, the dots are colored according to site to visualize this.
Chimpanzees
For the chimpanzees, the absolute level seems to be comparable with and without task experience.
For the bonobos, this is redundant with the site plot above.
Phylogenetic analysis
The goal of the phylogenetic analysis is twofold: On the one hand, we want to estimate how strong the phylogenetic signal is in our data, and on the other hand, we want to make inferences about how short-term memory capacity evolved over time.
Phylogenetic signal: \(\lambda\)
To answer the first question, we can look at “lambda” - \(\lambda\), a single value for estimating the strength of the phylogenetic signal in the data. In a nutshell, \(\lambda\) reflects whether species are as similar to one another as predicted by their shared evolutionary history. \(\lambda\) ranges (in most cases) between 0 and 1, with 0 meaning no and 1 meaning a strong signal. There are also significance tests for lambda (likelihood ratio tests). For a relatively understandable introduction to how lambda is computed, we recommend looking at a paper by Freckleton et al. (2002). A slightly less technical description is also given in MacLean et al. (2012).
In our case, \(\lambda\) can be estimated in two ways. First, we can do this based on the performance means alone. Second, it can be estimated as part of a phylogenetic t-test. This test is basically a one sample t-test that also recognizes that species might be more similar to one another due to their shared evolutionary history. The additional information that goes into the t-test is the standard deviation and the reference (chance) level. You can think of the first version as being something like a base \(\lambda\) and the second version an updated \(\lambda\).
To get more precise estimates for each species we aggregated the data across delays for this analysis. In principle, we could also repeat the analysis for each delay condition separately but we thought that the mean across delays reflects the overall level of short-term memory capacity in each species relatively well.
l.all = readRDS("07_lambda.rds")
t.all = readRDS("07_t-tests.rds")
LR.D = abs(2*t.all$logL)
Ddf = 1
p.val = 1 - pchisq(LR.D, Ddf, ncp = 0, lower.tail = T, log.p = F)
Here are the estimates for \(\lambda\) based on our data:
Base \(\lambda\) = 0.75, p = 0.254
Updated \(\lambda\) = 1, p = 0.023
Just based on the numerical value of \(\lambda\), it seems that there is a substantial phylogenetic signal in our data. That is, species that share a long evolutionary history tend to perform on a similar level. When updated, \(\lambda\) is also significantly different from 0.
A word of caution: This analysis is preliminary because we do not have much experience with this measure. As we learn more, the results and approach taken might change.
Reconstruction of ancestral state
Based on our data, we can also model the short-term memory capacity of hypothetical common ancestors in the primate lineage. The goal of ancestral state reconstruction is to estimate the condition of phenotypic traits at internal branching points, or nodes, in the tree. So in the case of primate cognition, we are interested in how recently stronger aptitudes evolved, and where along the tree these adaptations occurred.
Ancestral state reconstructions and visualization is described in Revell (2013), as well as in an R tutorial.
The plot can be read based on the color of the branches. The range on the bottom of the graph shows the color scheme mapped onto performance (between 0 and 1). The more green a branch is, the higher the estimated short-term memory capacity. The rectangles at the nodes reflect the 95% CIs for a given common ancestor. If a CI includes some red, the estimated capacity is not different from 1/3 (chance).
A first interpretation of this plot would be that there is a common primate basis of short-term memory capacity. This capacity increases in the lineage leading up to great apes.
n.b. As with the estimation of \(\lambda\), this analysis is preliminary. P. t. verus and P. pygmaeus were arbitrarily chosen as the representative species or subspecies of chimpanzees and orangutans. This was because detailed species and subspecies information was not available at this point in the study; the results were not affected by these decisions.
LS0tCnRpdGxlOiAiTWFueVByaW1hdGVzIFBpbG90IFN1bW1hcnkgb2YgUmVzdWx0cyIKYXV0aG9yOiAiTWFueVByaW1hdGVzIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGNzczogc3R5bGUuY3NzCiAgICB0aGVtZTogcGFwZXIKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGtuaXRyKQpgYGAKCmBgYHtyIGxvYWRpbmcgZGF0YX0KbXBfZGF0YSA8LSByZWFkLmNzdigiLi4vZGF0YS9tZXJnZWRfZGF0YS8wMV9tYW55cHJpbWF0ZXNfcGlsb3RfbWVyZ2VkX2RhdGFfdjIuY3N2IikKYGBgCgojIyBEZXNjcmlwdGl2ZXMgCgpIZXJlIGlzIGFuIG92ZXJ2aWV3IG9mIG91ciBzYW1wbGUuIFRoZSBzaXplIGFuZCBkaXZlcnNpdHkgYXJlIGltcHJlc3NpdmUuCgojIyMgU2FtcGxlIHNpemUKCmBgYHtyIGRlc2NyaXB0aXZlcyBvdmVyYWxsLCByZXN1bHRzID0gJ2FzaXMnfQptcF9kYXRhICU+JQogIHN1bW1hcml6ZShOID0gbl9kaXN0aW5jdChzdWJqZWN0X3NpdGUpLAogICAgICAgICAgICBTcGVjaWVzID0gbl9kaXN0aW5jdChzcGVjaWVzKSwKICAgICAgICAgICAgU2l0ZXMgPSBuX2Rpc3RpbmN0KHNpdGUpIC0gMSkgJT4lICMgc3dlZXR3YXRlcnMgYW5kIHN3ZWV0d2F0ZXJzX2dyb3VwMgogIGthYmxlKCkKYGBgCgojIyMgU2FtcGxlIHNpemUgYnkgc3BlY2llcwoKYGBge3IgZGVzY3JpcHRpdmVzIGJ5IHNpdGUgYW5kIHNwZWNpZXMsIHJlc3VsdHMgPSAnYXNpcyd9Cm1wX2RhdGEgJT4lCiAgZ3JvdXBfYnkoc3BlY2llcykgJT4lCiAgc3VtbWFyaXplKE4gPSBuX2Rpc3RpbmN0KHN1YmplY3Rfc2l0ZSksCiAgICAgICAgICAgIFNpdGVzID0gbl9kaXN0aW5jdChzaXRlKSkgJT4lCiAga2FibGUoKQpgYGAKCiMjIyBTaXRlcwoKIVtdKC4uL2dyYXBocy8wM19waWxvdF9zaXRlcy5wbmcpCgojIyBWaXN1YWwgb3ZlcnZpZXcKCkZpcnN0IGFuIG92ZXJ2aWV3IG9mIHRoZSBkYXRhLCBwbG90dGVkIGJ5IHNwZWNpZXMgYW5kIGRlbGF5LiBTbWFsbCwgdHJhbnNwYXJlbnQgZG90cyByZXByZXNlbnQgYWdncmVnYXRlZCBkYXRhIGZvciBlYWNoIGluZGl2aWR1YWwgYnkgZGVsYXkuIFNvbGlkIGRvdHMgYXJlIHNwZWNpZXMgbWVhbnMgZm9yIGEgZ2l2ZW4gZGVsYXkuIEVycm9yIGJhcnMgYXJlIDk1JSBjb25maWRlbmNlIGludGVydmFscyAoQ0kpLiBEb3R0ZWQgbGluZSByZXByZXNlbnRzIGxldmVsIGV4cGVjdGVkIGJ5IGNoYW5jZS4gUGVyZm9ybWFuY2UgaXMgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSBjaGFuY2UsIGlmIHRoZSBDSSBkb2VzIG5vdCBvdmVybGFwIHdpdGggdGhlIGNoYW5jZSBsaW5lLiAKClNwZWNpZXMgYXJlIGdyb3VwZWQgYnkgcGh5bG9nZW55LCB3aXRoIGxlbXVycyBvbiB0b3AsIGZvbGxvd2VkIGJ5IG5ldyB3b3JsZCBtb25rZXlzLCBvbGQgd29ybGQgbW9ua2V5cyBhbmQgYXBlcy4KCiFbXSguLi9ncmFwaHMvMDJfMDFfb3ZlcnZpZXcucG5nKQoKIyMgSW5mZXJlbmNlOiBHTE1NCgpUaGUgbWFpbiBwdXJwb3NlIG9mIHRoZSBtb2RlbCBpcyB0byB0ZXN0IG91ciB0d28gaHlwb3RoZXNpczoKCjEuIFByb2JhYmlsaXR5IG9mIGNvcnJlY3QgY2hvaWNlIGRlY3JlYXNlcyB3aXRoIGRlbGF5IGxlbmd0aCAobWFpbiBlZmZlY3Qgb2YgZGVsYXkpCjIuIFByb2JhYmlsaXR5IG9mIGNvcnJlY3QgY2hvaWNlIGRlY3JlYXNlcyBpbiBvbGRlciBpbmRpdmlkdWFscyBpbiBsb25nZXIgZGVsYXlzIChpbnRlcmFjdGlvbiBiZXR3ZWVuIGFnZSBhbmQgZGVsYXkpCgpUaGUgcHJlLXJlZ2lzdGVyZWQgbW9kZWwgaGFkIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlCgpgYGAKY29ycmVjdCB+IGRlbGF5ICogYWdlICsKICAgICAgICAgIHRhc2tfZXhwZXJpZW5jZSArIGN1cF9kaXN0YW5jZSArIGJvYXJkX3NpemUgKyB0cmlhbCArCiAgICAgICAgICAoMSArIGRlbGF5ICsgdHJpYWwgfCBzaXRlL3N1YmplY3QvYmxvY2svaGlkaW5nX2xvY2F0aW9uICkgKwogICAgICAgICAgKDEgKyB0YXNrX2V4cGVyaWVuY2UgKyBjdXBfZGlzdGFuY2UgKyBib2FyZF9zaXplICsgdHJpYWwgKyBkZWxheSB8IHNwZWNpZXMpCmBgYAoKQmFzZWQgb24gY29udmVyZ2VuY2UgaXNzdWVzIGFuZCBvdGhlciBjb25zaWRlcmF0aW9ucyAoc2VlIGAwNV9taXhlZF9tb2RlbGAgZmlsZSBmb3IgZGV0YWlscyBvbiB0aGUgZGVjaXNpb24gcHJvY2Vzcykgd2UgbW9kaWZpZWQgdGhlIHJhbmRvbSBlZmZlY3Qgc3RydWN0dXJlIGFuZCByZW1vdmUgYm9hcmQgc2l6ZSwgd2hpY2ggY28tdmFyaWVkIHdpdGggY3VwIGRpc3RhbmNlLiBUaGUgcmVkdWNlZCBtb2RlbCBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6IAoKYGBgCmNvcnJlY3QgfiBkZWxheSAqIG5vcm1fYWdlICsgCiAgICAgICAgICB0YXNrX2V4cGVyaWVuY2UgKyBjdXBfZGlzdGFuY2UgKyB0cmlhbCArIAogICAgICAgICAgKDEgKyBkZWxheSB8IHNpdGUvc3ViamVjdF9zaXRlKSArIAogICAgICAgICAgKDEgKyBkZWxheSB8IHNwZWNpZXMpCmBgYAoKVmFyaWFibGUgbmFtZXMgaW4gdGhlIGRhdGEgZnJhbWU6CgoqIGBzdWJqZWN0X3NpdGUgPSBzdWJqZWN0YAoqIGBub3JtX2FnZSA9IGFnZWAgZGl2aWRlZCBieSBzcGVjaWVzIGxvbmdldml0eSBhbmQgc2NhbGVkIGFuZCBjZW50ZXJlZCBhY3Jvc3Mgc3BlY2llcwoKQmVsb3csIHdlIHBsb3Qgb2RkcyByYXRpb3MgZm9yIGZpeGVkIGVmZmVjdHMuIEFzIGEgZ3VpZGVsaW5lIGZvciBpbnRlcnByZXRhdGlvbiwgZXJyb3JiYXJzIHRoYXQgZG8gbm90IG92ZXJsYXAgd2l0aCB0aGUgdmVydGljYWwgbGluZSBpbmRpY2F0ZSBhIHNpZ25pZmljYW50IGVmZmVjdCBpbiB0aGUgbW9kZWwuCgohW10oLi4vZ3JhcGhzLzA1X2ZvcmVzdHBsb3QucG5nKQoKIyMjIEVmZmVjdCBvZiBkZWxheQoKV2hhdCB3ZSBzZWUgaXMgYSBzaWduaWZpY2FudCBlZmZlY3Qgb2YgZGVsYXkuIFRoZSByZWZlcmVuY2UgbGV2ZWwgaXMgdGhlIHNob3J0IGRlbGF5IGNvbmRpdGlvbiBhbmQgcGVyZm9ybWFuY2UgaW4gdGhlIGxvbmcgYXMgd2VsbCBhcyBpbiB0aGUgbWVkaXVtIGNvbmRpdGlvbiBhcmUgc2lnbmlmaWNhbnRseSB3b3JzZSBjb21wYXJlZCB0byB0aGlzLiBUaGlzIHN1Z2dlc3RzIHRoYXQsIGFjcm9zcyBzcGVjaWVzLCBwZXJmb3JtYW5jZSBkZWNyZWFzZXMgaW4gdGhlIGRlbGF5IHRyaWFscy4gVGhpcyBjb25maXJtcyB0aGUgaW50dWl0aW9uIG9uZSBnZXRzIGZyb20gbG9va2luZyBhdCB0aGUgc3VtbWFyeSBwbG90IGFib3ZlLiBJbiBhbm90aGVyIG1vZGVsLCBub3Qgc2hvd24gaGVyZSwgd2UgdGVzdGVkIGlmIG1lZGl1bSBkZWxheSBpcyBhbHNvIGRpZmZlcmVudCBmcm9tIGxvbmcgZGVsYXkgYW5kIGZvdW5kIHRoYXQgdGhpcyB3YXMgdGhlIGNhc2UuIFRoaXMgc2hvd3MgYSBncmFkZWQgcmV0ZW50aW9uIGVmZmVjdCBhY3Jvc3Mgc3BlY2llcy4gCgojIyMgSW50ZXJhY3Rpb24gb2YgYWdlIGFuZCBkZWxheQoKTm8gc3VjaCBpbnRlcmFjdGlvbiBjb3VsZCBiZSBmb3VuZCBpbiB0aGUgbW9kZWwuIEJlbG93IHdlIHBsb3QgcGVyZm9ybWFuY2UgYWdncmVnYXRlZCBmb3IgZWFjaCBzdWJqZWN0IGFnYWluc3QgYWdlIChyZWdyZXNzaW9uIGxpbmUgaXMgc21vb3RoZWQgY29uZGl0aW9uYWwgbWVhbiB3aXRoIDk1JSBDSSkuIFRoaXMgdmlzdWFsaXphdGlvbiBjb25maXJtcyB0aGUgc3RhdGlzdGljYWwgYW5hbHlzaXMuIEFzIHBhcnQgb2YgdGhlIGV4cGxvcmF0b3J5IGFuYWx5c2lzLCB3ZSBtaWdodCB3YW50IHRvIGxvb2sgZm9yIGEgcXVhZHJhdGljIG9yIGN1YmljIHJlbGF0aW9uIGJldHdlZW4gYWdlLCBkZWxheSBhbmQgcGVyZm9ybWFuY2UuCgohW10oLi4vZ3JhcGhzLzAyXzA5X2FnZV9ieV9kZWxheS5wbmcpCgojIyMgRWZmZWN0IG9mIGN1cCBkaXN0YW5jZQoKV2UgZGlkIG5vdCBleHBlY3Qgc3VjaCBhbiBlZmZlY3QgYW5kIGxvb2tpbmcgYXQgdGhlIGRhdGEgaXQgaXMgdW5saWtlbHkgdGhhdCBjdXAgZGlzdGFuY2UgaW4gYW5kIG9mIGl0c2VsZiBpcyBkcml2aW5nIHRoaXMgZWZmZWN0LiBMb29raW5nIGF0IHRoZSBncmFwaCBiZWxvdywgb25lIGNhbiBzZWUgdGhhdCBjdXAgZGlzdGFuY2UgaXMgY29uZm91bmRlZCB3aXRoIHNwZWNpZXMgKHByZXN1bWFibHkgZHVlIHRvIGJvZHkgc2l6ZSkgYW5kIGFsc28gc2l0ZSB3aXRoaW4gc3BlY2llcy4gVGhpcyBpcyBlZmZlY3QgaXMgdGhlcmVmb3JlIGxpa2VseSBhIHJlc3VsdCBvZiBhZGp1c3RpbmcgdGhlIHRlc3Qgc2V0dXAgdG8gc2l0ZSBhbmQgc3BlY2llcy4KCiFbXSguLi9ncmFwaHMvMDJfMTFfY3VwX2Rpc3RhbmNlLnBuZykKCiMjIENvbXBhcmluZyBzaXRlcwoKSGVyZSB3ZSBzZWxlY3QgdGhlIHNwZWNpZXMgZm9yIHdoaWNoIHdlIGhhdmUgZGF0YSBmcm9tIG11bHRpcGxlIHNpdGVzLiBUaGlzIGlzIGEgcm91Z2ggd2F5IG9mIGNoZWNraW5nIHdoZXRoZXIgdGhlcmUgaXMgYSBsb3Qgb2YgdmFyaWF0aW9uIGJldHdlZW4gc2l0ZXMuIFBsb3R0aW5nIGNvbnZlbnRpb25zIGFyZSB0aGUgc2FtZSBhcyBhYm92ZS4KCkJhc2VkIG9uIHRoZSB0YWJsZSBhYm92ZSwgd2UgaGF2ZSBkYXRhIGZyb20gbXVsdGlwbGUgc2l0ZXMgZm9yIGJvbm9ib3MsIGNoaW1wYW56ZWVzLCBjYXB1Y2hpbnMsIGdvcmlsbGFzIGFuZCByaW5nLXRhaWxlZCBsZW11cnMuIFRoZSBtb3N0IGluZm9ybWF0aXZlIHBsb3RzIHdpbGwgYmUgdGhlIG9uZXMgZm9yIGNoaW1wYW56ZWVzIGFuZCBjYXB1Y2hpbnMgYmVjYXVzZSB0aGVyZSB3ZSBoYXZlIHRoZSBsYXJnZXN0IHNhbXBsZSBzaXplIHBlciBzaXRlLiAKCldlIGNhbiBjb21wYXJlIGFic29sdXRlIGxldmVsIG9mIHBlcmZvcm1hbmNlIChpbiB3aGF0IHJhbmdlIG9mIGNvcnJlY3QgcHJvcG9ydGlvbnMgZG9lcyB0aGUgZGF0YSBhY3Jvc3MgZGVsYXlzIGZyb20gZWFjaCBzaXRlIGZhbGwpIGFzIHdlbGwgYXMgcmVsYXRpdmUgKGhvdyBkbyB0aGUgZGVsYXlzIGNvbXBhcmUgdG8gb25lIGFub3RoZXIpLgoKIyMjIENoaW1wYW56ZWVzCgpIZXJlIHdlIHNlZSB0aGF0IHBlcmZvcm1hbmNlIG9uIGFuIGFic29sdXRlIGxldmVsIGlzIGZhaXJseSBzaW1pbGFyIGFjcm9zcyBzaXRlcy4gVGhlIExlaXB6aWcgY2hpbXBhbnplZXMgc2VlbSB0byBwZXJmb3JtIGJldHRlciBjb21wYXJlZCB0byB0aGUgb3RoZXJzLCBidXQgdGhpcyBtaWdodCBiZSBkdWUgdG8gdGhlbSBiZWluZyBpbnZvbHZlZCBpbiBhIGxvdCBvZiBzdHVkaWVzIHVzaW5nIHRoZSBzYW1lIG9yIGEgdmVyeSBzaW1pbGFyIHNldHVwLgoKIVtdKC4uL2dyYXBocy8wMl8wM19jaGltcF9ieV9zaXRlLnBuZykKCiMjIyBSaW5nLXRhaWxlZCBsZW11cnMKCkFnYWluLCB0aGUgYWJzb2x1dGUgbGV2ZWwgaXMgc2ltaWxhciBhY3Jvc3Mgc2l0ZXMsIGJ1dCB0aGVyZSBhcmUgdmVyeSBmZXcgZGF0YSBmcm9tIG9uZSBzaXRlLgoKIVtdKC4uL2dyYXBocy8wMl8wNF9ydGxlbXVyX2J5X3NpdGUucG5nKQoKIyMjIEJyb3duIENhcHVjaGlucwoKSGVyZSB3ZSBoYXZlIGEgZGVjZW50IHNhbXBsZSBzaXplIGZvciBib3RoIHNpdGVzLiBBYnNvbHV0ZSBhbmQgcmVsYXRpdmUgcGVyZm9ybWFuY2UgbG9va3MgdmVyeSBzaW1pbGFyLiAKCiFbXSguLi9ncmFwaHMvMDJfMDVfY2FwdWNoaW5fYnlfc2l0ZS5wbmcpCgojIyMgQm9ub2JvcwoKSGVyZSB3ZSBoYXZlIHJlbGF0aXZlbHkgZmV3IGRhdGEgYW5kIHRoZXJlZm9yZSBxdWl0ZSB2YXJpYWJsZSBlc3RpbWF0ZXMuIFBlcmZvcm1hbmNlIGxvb2tzIG1vcmUgdmFyaWFibGUgY29tcGFyZWQgdG8gdGhlIG90aGVyIHNwZWNpZXMuCgohW10oLi4vZ3JhcGhzLzAyXzA2X2Jvbm9ib19ieV9zaXRlLnBuZykKCiMjIyBHb3JpbGxhcwoKUmVsYXRpdmUgcGVyZm9ybWFuY2UgbG9va3Mgc2ltaWxhci4gVGhlIExpbmNvbG4gUGFyayBnb3JpbGxhcyBkaWQgY29uc2lzdGVudGx5IHdvcnNlIHRoYW4gdGhlIEhlaWRlbGJlcmcgZ29yaWxsYXMsIGJ1dCB0aGVyZSdzIGxpdHRsZSBkYXRhIGZvciBlaXRoZXIgc2l0ZS4KCiFbXSguLi9ncmFwaHMvMDJfMDdfZ29yaWxsYV9ieV9zaXRlLnBuZykKCiMjIENvbXBhcmluZyBhY3Jvc3MgdGFzay1leHBlcmllbmNlCgpFdmVuIHRob3VnaCB3ZSBkaWQgbm90IGZpbmQgYW4gb3ZlcmFsbCBlZmZlY3Qgb2YgdGFzayBleHBlcmllbmNlIGluIHRoZSBtb2RlbCwgaXQgbWlnaHQgYmUgaW50ZXJlc3RpbmcgdG8gbG9vayBhdCBob3cgc3ViamVjdHMgZnJvbSBvbmUgc3BlY2llcyB3aXRoIGRpZmZlcmVudCBsZXZlbHMgb2YgdGFzayBleHBlcmllbmNlIHBlcmZvcm0uIFRoaXMgb25seSBhcHBsaWVzIHRvIGNoaW1wYW56ZWVzIGFuZCBib25vYm9zLiBIb3dldmVyLCB0YXNrIGV4cGVyaWVuY2UgaXMgY29uZm91bmRlZCB3aXRoIHNpdGUuIEluIHRoZSBwbG90cyBiZWxvdywgdGhlIGRvdHMgYXJlIGNvbG9yZWQgYWNjb3JkaW5nIHRvIHNpdGUgdG8gdmlzdWFsaXplIHRoaXMuCgojIyMgQ2hpbXBhbnplZXMKCkZvciB0aGUgY2hpbXBhbnplZXMsIHRoZSBhYnNvbHV0ZSBsZXZlbCBzZWVtcyB0byBiZSBjb21wYXJhYmxlIHdpdGggYW5kIHdpdGhvdXQgdGFzayBleHBlcmllbmNlLiAKCkZvciB0aGUgYm9ub2JvcywgdGhpcyBpcyByZWR1bmRhbnQgd2l0aCB0aGUgc2l0ZSBwbG90IGFib3ZlLiAKCiFbXSguLi9ncmFwaHMvMDJfMDhfdGFza19leHBlcmllbmNlLnBuZykKCiMjIFBoeWxvZ2VuZXRpYyBhbmFseXNpcwoKVGhlIGdvYWwgb2YgdGhlIHBoeWxvZ2VuZXRpYyBhbmFseXNpcyBpcyB0d29mb2xkOiBPbiB0aGUgb25lIGhhbmQsIHdlIHdhbnQgdG8gZXN0aW1hdGUgaG93IHN0cm9uZyB0aGUgcGh5bG9nZW5ldGljIHNpZ25hbCBpcyBpbiBvdXIgZGF0YSwgYW5kIG9uIHRoZSBvdGhlciBoYW5kLCB3ZSB3YW50IHRvIG1ha2UgaW5mZXJlbmNlcyBhYm91dCBob3cgc2hvcnQtdGVybSBtZW1vcnkgY2FwYWNpdHkgZXZvbHZlZCBvdmVyIHRpbWUuCgojIyMgUGh5bG9nZW5ldGljIHNpZ25hbDogJFxsYW1iZGEkCgpUbyBhbnN3ZXIgdGhlIGZpcnN0IHF1ZXN0aW9uLCB3ZSBjYW4gbG9vayBhdCAibGFtYmRhIiAtICRcbGFtYmRhJCwgYSBzaW5nbGUgdmFsdWUgZm9yIGVzdGltYXRpbmcgdGhlIHN0cmVuZ3RoIG9mIHRoZSBwaHlsb2dlbmV0aWMgc2lnbmFsIGluIHRoZSBkYXRhLiBJbiBhIG51dHNoZWxsLCAkXGxhbWJkYSQgcmVmbGVjdHMgd2hldGhlciBzcGVjaWVzIGFyZSBhcyBzaW1pbGFyIHRvIG9uZSBhbm90aGVyIGFzIHByZWRpY3RlZCBieSB0aGVpciBzaGFyZWQgZXZvbHV0aW9uYXJ5IGhpc3RvcnkuICRcbGFtYmRhJCByYW5nZXMgKGluIG1vc3QgY2FzZXMpIGJldHdlZW4gMCBhbmQgMSwgd2l0aCAwIG1lYW5pbmcgbm8gYW5kIDEgbWVhbmluZyBhIHN0cm9uZyBzaWduYWwuIFRoZXJlIGFyZSBhbHNvIHNpZ25pZmljYW5jZSB0ZXN0cyBmb3IgbGFtYmRhIChsaWtlbGlob29kIHJhdGlvIHRlc3RzKS4gRm9yIGEgcmVsYXRpdmVseSB1bmRlcnN0YW5kYWJsZSBpbnRyb2R1Y3Rpb24gdG8gaG93IGxhbWJkYSBpcyBjb21wdXRlZCwgd2UgcmVjb21tZW5kIGxvb2tpbmcgYXQgYSBwYXBlciBieSBbRnJlY2tsZXRvbiBldCBhbC4gKDIwMDIpXShodHRwczovL3d3dy5qb3VybmFscy51Y2hpY2Fnby5lZHUvZG9pLzEwLjEwODYvMzQzODczKS4gQSBzbGlnaHRseSBsZXNzIHRlY2huaWNhbCBkZXNjcmlwdGlvbiBpcyBhbHNvIGdpdmVuIGluIFtNYWNMZWFuIGV0IGFsLiAoMjAxMildKGh0dHBzOi8vbGluay5zcHJpbmdlci5jb20vYXJ0aWNsZS8xMC4xMDA3JTJGczEwMDcxLTAxMS0wNDQ4LTgpLgoKSW4gb3VyIGNhc2UsICRcbGFtYmRhJCBjYW4gYmUgZXN0aW1hdGVkIGluIHR3byB3YXlzLiBGaXJzdCwgd2UgY2FuIGRvIHRoaXMgYmFzZWQgb24gdGhlIHBlcmZvcm1hbmNlIG1lYW5zIGFsb25lLiBTZWNvbmQsIGl0IGNhbiBiZSBlc3RpbWF0ZWQgYXMgcGFydCBvZiBhIHBoeWxvZ2VuZXRpYyB0LXRlc3QuIFRoaXMgdGVzdCBpcyBiYXNpY2FsbHkgYSBvbmUgc2FtcGxlIHQtdGVzdCB0aGF0IGFsc28gcmVjb2duaXplcyB0aGF0IHNwZWNpZXMgbWlnaHQgYmUgbW9yZSBzaW1pbGFyIHRvIG9uZSBhbm90aGVyIGR1ZSB0byB0aGVpciBzaGFyZWQgZXZvbHV0aW9uYXJ5IGhpc3RvcnkuIFRoZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoYXQgZ29lcyBpbnRvIHRoZSB0LXRlc3QgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBhbmQgdGhlIHJlZmVyZW5jZSAoY2hhbmNlKSBsZXZlbC4gWW91IGNhbiB0aGluayBvZiB0aGUgZmlyc3QgdmVyc2lvbiBhcyBiZWluZyBzb21ldGhpbmcgbGlrZSBhIGJhc2UgJFxsYW1iZGEkIGFuZCB0aGUgc2Vjb25kIHZlcnNpb24gYW4gdXBkYXRlZCAkXGxhbWJkYSQuCgpUbyBnZXQgbW9yZSBwcmVjaXNlIGVzdGltYXRlcyBmb3IgZWFjaCBzcGVjaWVzIHdlIGFnZ3JlZ2F0ZWQgdGhlIGRhdGEgYWNyb3NzIGRlbGF5cyBmb3IgdGhpcyBhbmFseXNpcy4gSW4gcHJpbmNpcGxlLCB3ZSBjb3VsZCBhbHNvIHJlcGVhdCB0aGUgYW5hbHlzaXMgZm9yIGVhY2ggZGVsYXkgY29uZGl0aW9uIHNlcGFyYXRlbHkgYnV0IHdlIHRob3VnaHQgdGhhdCB0aGUgbWVhbiBhY3Jvc3MgZGVsYXlzIHJlZmxlY3RzIHRoZSBvdmVyYWxsIGxldmVsIG9mIHNob3J0LXRlcm0gbWVtb3J5IGNhcGFjaXR5IGluIGVhY2ggc3BlY2llcyByZWxhdGl2ZWx5IHdlbGwuCgpgYGB7cn0KbC5hbGwgPSByZWFkUkRTKCIwN19sYW1iZGEucmRzIikKdC5hbGwgPSByZWFkUkRTKCIwN190LXRlc3RzLnJkcyIpCgpMUi5EID0gYWJzKDIqdC5hbGwkbG9nTCkKRGRmID0gMQpwLnZhbCA9IDEgLSBwY2hpc3EoTFIuRCwgRGRmLCBuY3AgPSAwLCBsb3dlci50YWlsID0gVCwgbG9nLnAgPSBGKQpgYGAKCkhlcmUgYXJlIHRoZSBlc3RpbWF0ZXMgZm9yICRcbGFtYmRhJCBiYXNlZCBvbiBvdXIgZGF0YToKCkJhc2UgJFxsYW1iZGEkID0gYHIgcm91bmQobC5hbGwkbGFtYmRhLCAyKWAsICpwKiA9IGByIHJvdW5kKGwuYWxsJFAsIDMpYAoKVXBkYXRlZCAkXGxhbWJkYSQgPSBgciByb3VuZCh0LmFsbCRsYW1iZGEsIDIpYCwgKnAqID0gYHIgcm91bmQocC52YWwsIDMpYAoKSnVzdCBiYXNlZCBvbiB0aGUgbnVtZXJpY2FsIHZhbHVlIG9mICRcbGFtYmRhJCwgaXQgc2VlbXMgdGhhdCB0aGVyZSBpcyBhIHN1YnN0YW50aWFsIHBoeWxvZ2VuZXRpYyBzaWduYWwgaW4gb3VyIGRhdGEuIFRoYXQgaXMsIHNwZWNpZXMgdGhhdCBzaGFyZSBhIGxvbmcgZXZvbHV0aW9uYXJ5IGhpc3RvcnkgdGVuZCB0byBwZXJmb3JtIG9uIGEgc2ltaWxhciBsZXZlbC4gV2hlbiB1cGRhdGVkLCAkXGxhbWJkYSQgaXMgYWxzbyBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIDAuCgpBIHdvcmQgb2YgY2F1dGlvbjogVGhpcyBhbmFseXNpcyBpcyBwcmVsaW1pbmFyeSBiZWNhdXNlIHdlIGRvIG5vdCBoYXZlIG11Y2ggZXhwZXJpZW5jZSB3aXRoIHRoaXMgbWVhc3VyZS4gQXMgd2UgbGVhcm4gbW9yZSwgdGhlIHJlc3VsdHMgYW5kIGFwcHJvYWNoIHRha2VuIG1pZ2h0IGNoYW5nZS4gIAoKIyMjIFJlY29uc3RydWN0aW9uIG9mIGFuY2VzdHJhbCBzdGF0ZQoKQmFzZWQgb24gb3VyIGRhdGEsIHdlIGNhbiBhbHNvIG1vZGVsIHRoZSBzaG9ydC10ZXJtIG1lbW9yeSBjYXBhY2l0eSBvZiBoeXBvdGhldGljYWwgY29tbW9uIGFuY2VzdG9ycyBpbiB0aGUgcHJpbWF0ZSBsaW5lYWdlLiBUaGUgZ29hbCBvZiBhbmNlc3RyYWwgc3RhdGUgcmVjb25zdHJ1Y3Rpb24gaXMgdG8gZXN0aW1hdGUgdGhlIGNvbmRpdGlvbiBvZiBwaGVub3R5cGljIHRyYWl0cyBhdCBpbnRlcm5hbCBicmFuY2hpbmcgcG9pbnRzLCBvciBub2RlcywgaW4gdGhlIHRyZWUuIFNvIGluIHRoZSBjYXNlIG9mIHByaW1hdGUgY29nbml0aW9uLCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBob3cgcmVjZW50bHkgc3Ryb25nZXIgYXB0aXR1ZGVzIGV2b2x2ZWQsIGFuZCB3aGVyZSBhbG9uZyB0aGUgdHJlZSB0aGVzZSBhZGFwdGF0aW9ucyBvY2N1cnJlZC4KCkFuY2VzdHJhbCBzdGF0ZSByZWNvbnN0cnVjdGlvbnMgYW5kIHZpc3VhbGl6YXRpb24gaXMgZGVzY3JpYmVkIGluIFtSZXZlbGwgKDIwMTMpXShodHRwczovL2Jlc2pvdXJuYWxzLm9ubGluZWxpYnJhcnkud2lsZXkuY29tL2RvaS9hYnMvMTAuMTExMS8yMDQxLTIxMFguMTIwNjYpLCBhcyB3ZWxsIGFzIGluIGFuIFIgW3R1dG9yaWFsXShodHRwOi8vd3d3LnBoeXRvb2xzLm9yZy9lcWcyMDE1L2Fzci5odG1sKS4gCgpUaGUgcGxvdCBjYW4gYmUgcmVhZCBiYXNlZCBvbiB0aGUgY29sb3Igb2YgdGhlIGJyYW5jaGVzLiBUaGUgcmFuZ2Ugb24gdGhlIGJvdHRvbSBvZiB0aGUgZ3JhcGggc2hvd3MgdGhlIGNvbG9yIHNjaGVtZSBtYXBwZWQgb250byBwZXJmb3JtYW5jZSAoYmV0d2VlbiAwIGFuZCAxKS4gVGhlIG1vcmUgZ3JlZW4gYSBicmFuY2ggaXMsIHRoZSBoaWdoZXIgdGhlIGVzdGltYXRlZCBzaG9ydC10ZXJtIG1lbW9yeSBjYXBhY2l0eS4gVGhlIHJlY3RhbmdsZXMgYXQgdGhlIG5vZGVzIHJlZmxlY3QgdGhlIDk1JSBDSXMgZm9yIGEgZ2l2ZW4gY29tbW9uIGFuY2VzdG9yLiBJZiBhIENJIGluY2x1ZGVzIHNvbWUgcmVkLCB0aGUgZXN0aW1hdGVkIGNhcGFjaXR5IGlzIG5vdCBkaWZmZXJlbnQgZnJvbSAxLzMgKGNoYW5jZSkuCgohW10oLi4vZ3JhcGhzLzA3X2FuY2VzdHJhbF9zdGF0ZS5wbmcpCgpBIGZpcnN0IGludGVycHJldGF0aW9uIG9mIHRoaXMgcGxvdCB3b3VsZCBiZSB0aGF0IHRoZXJlIGlzIGEgY29tbW9uIHByaW1hdGUgYmFzaXMgb2Ygc2hvcnQtdGVybSBtZW1vcnkgY2FwYWNpdHkuIFRoaXMgY2FwYWNpdHkgaW5jcmVhc2VzIGluIHRoZSBsaW5lYWdlIGxlYWRpbmcgdXAgdG8gZ3JlYXQgYXBlcy4gCgoqbi5iLiogQXMgd2l0aCB0aGUgZXN0aW1hdGlvbiBvZiAgJFxsYW1iZGEkLCB0aGlzIGFuYWx5c2lzIGlzIHByZWxpbWluYXJ5LiAqUC4gdC4gdmVydXMqIGFuZCAqUC4gcHlnbWFldXMqIHdlcmUgYXJiaXRyYXJpbHkgY2hvc2VuIGFzIHRoZSByZXByZXNlbnRhdGl2ZSBzcGVjaWVzIG9yIHN1YnNwZWNpZXMgb2YgY2hpbXBhbnplZXMgYW5kIG9yYW5ndXRhbnMuIFRoaXMgd2FzIGJlY2F1c2UgZGV0YWlsZWQgc3BlY2llcyBhbmQgc3Vic3BlY2llcyBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZSBhdCB0aGlzIHBvaW50IGluIHRoZSBzdHVkeTsgdGhlIHJlc3VsdHMgd2VyZSBub3QgYWZmZWN0ZWQgYnkgdGhlc2UgZGVjaXNpb25zLgoKCg==